package main

import (
	"fmt"
	"time"
	"context"
	"golang.org/x/time/rate"
)

/*
该限流器是基于 Token Bucket(令牌桶) 实现的。
简单来说，令牌桶就是想象有一个固定大小的桶，系统会以恒定速率向桶中放 Token，桶满则暂时不放。
而用户则从桶中取 Token，如果有剩余 Token 就可以一直取。如果没有剩余 Token，则需要等到系统中被放置了 Token 才行。
 */

func main()  {
	l := rate.NewLimiter(1, 3) // 一个参数为每秒发生多少次事件，第二个参数是最大可运行多少个事件(burst)
	c, _ := context.WithCancel(context.TODO())
	for {
		l.Wait(c)    //刚开始桶是满的，所以不阻塞，会执行3次
		fmt.Println(time.Now().Format("04:05.000"))
	}
}

//输出
//07:35.055
//07:35.055
//07:35.055
//07:36.060
//07:37.059
//07:38.059
//缓存3次后，每秒执行一次